package com.zjsru.plan2025.oneday;

import java.util.Arrays;

/**
 * 1760. 袋子里最少数目的球
 *
 * @Author: cookLee
 * @Date: 2025-02-12
 */
public class MinimumSize {

    /**
     * 主
     * \
     * 输入：nums = [9], maxOperations = 2
     * 输出：3
     * 解释：
     * - 将装有 9 个球的袋子分成装有 6 个和 3 个球的袋子。[9] -> [6,3] 。
     * - 将装有 6 个球的袋子分成装有 3 个和 3 个球的袋子。[6,3] -> [3,3,3] 。
     * 装有最多球的袋子里装有 3 个球，所以开销为 3 并返回 3 。
     * \
     * 输入：nums = [2,4,8,2], maxOperations = 4
     * 输出：2
     * 解释：
     * - 将装有 8 个球的袋子分成装有 4 个和 4 个球的袋子。[2,4,8,2] -> [2,4,4,4,2] 。
     * - 将装有 4 个球的袋子分成装有 2 个和 2 个球的袋子。[2,4,4,4,2] -> [2,2,2,4,4,2] 。
     * - 将装有 4 个球的袋子分成装有 2 个和 2 个球的袋子。[2,2,2,4,4,2] -> [2,2,2,2,2,4,2] 。
     * - 将装有 4 个球的袋子分成装有 2 个和 2 个球的袋子。[2,2,2,2,2,4,2] -> [2,2,2,2,2,2,2,2] 。
     * 装有最多球的袋子里装有 2 个球，所以开销为 2 并返回 2 。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MinimumSize minimumSize = new MinimumSize();
        int[] nums = new int[]{9};
        System.out.println(minimumSize.minimumSize(nums, 200));
    }

    /**
     * 二分
     *
     * @param nums          nums
     * @param maxOperations 最大操作数
     * @return int
     */
    public int minimumSize(int[] nums, int maxOperations) {
        int left = 0;
        int right = Arrays.stream(nums).max().getAsInt();
        while (left < right) {
            int mid = (left + right) / 2;
            if (this.check(nums, mid, maxOperations)) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return right;
    }

    /**
     * 检查拆分是否满足次数要求
     *
     * @param nums          nums
     * @param mid           中
     * @param maxOperations 最大操作数
     * @return boolean
     */
    private boolean check(int[] nums, int mid, int maxOperations) {
        if (mid == 0) {
            return false;
        }
        int count = 0;
        for (int num : nums) {
            count += (num - 1) / mid;
        }
        return count <= maxOperations;
    }

}
